
package Report;

import java.util.Vector;
import java.util.Date;

/**
 * Ein <code>ReportWriter</code>, der Reports mittels HTML formatiert. Das im
 * Zielformat vorliegende Ergebnis wird in der Variable <code>reportText</code>
 * abgelegt und kann nach Aufruf der entsprechenden Prozessierungsmethode mit
 * <code>getReportText()</code> ausgelesen werden.
 *
 * @author Thies (Quelle: BankProjekt 1.1)
 * @author Philipp Armbruster
 */
public class HTMLReportWriter extends ReportWriter {

    /**
     * Diese Variable wird mit dem Ergebnis einer Umwandlung (vgl.
     * <code>process...</code>-Methoden) belegt. Format: HTML-Text
     */
    private String reportText = "";

    /**
     * Zurücksetzen der Variable <code>reportText</code>.
     */
    public void resetReportText() {
            this.reportText = "";
    }

    /**
     * Umwandeln eines <code>Paragraph</code>-Objekts in HTML.
     * @param p der Paragraph
     * @return HTML-Text
     */
    public String paragraph2HTML(Paragraph p) {
            if ( p instanceof CompositeParagraph ) {
                    return this.paragraph2HTML((CompositeParagraph)p);
            }
            else {
                    return this.paragraph2HTML((SimpleParagraph)p);
            }
    }


    /**
     * Umwandeln eines <code>CompositeParagraph</code>-Objekts in HTML.
     * @param p der CompositeParagraph
     * @return HTML-Text
     */
    public String paragraph2HTML(CompositeParagraph p) {
            StringBuffer result = new StringBuffer();

            for ( int i = 0; i < p.getNumParagraphs(); i++ ) {
                    result.append("<p style=\"line-height: 1\">" + p.getParagraphAt(i)+ "</p>");
            }

            return result.toString();
    }

    /**
     * Umwandeln eines <code>SimpleParagraph</code>-Objekts in HTML.
     * @param p der SimpleParagraph
     * @return HTML-Text
     */
    public String paragraph2HTML(SimpleParagraph p) {
            return "<p>" + p.toString() + "</p>";
    }

    /**
     * HTML-Header-Text produzieren.
     * @return HTML-Text
     */
    public String getHeader() {
            StringBuffer result = new StringBuffer();

            result.append("<html><head><title></title></head><body style=\"color : black\">");
            return result.toString();
    }

    /**
     * HTML-Trailer-Text produzieren.
     * @return HTML-Text
     */
    public String getTrailer() {
            return "</body></html>";
    }

    /**
     * Prozessieren des übergebenen Reports und Ablage im Zielformat. Ein Auslesen
     * des Ergebnisses kann später mittels <code>getReportText()</code> erfolgen.
     *
     * @param r der zu prozessierende Report
     */
    public void process(SeatallocationOfASpecificFlightRealizationReport r) {
            // Zunächst löschen wir das Ergebnis vorhergehender Prozessierungen.
            this.resetReportText();

            /*
             * In diesen Buffer schreiben wir während der Prozessierung sukzessive unsere
             * Ergebnisse.
             */
            StringBuffer result = new StringBuffer();

            /**
             * Erstellungsdatum zwischenspeichern
             */
            Date d = r.getDateOfReport();

            /*
             * Nun werden Schritt für Schritt die einzelnen Bestandteile des Reports
             * ausgelesen und in HTML-Form übersetzt.
             */
            result.append("<h2 style=\"color: blue\">" + r.getTitle() + "</h2>");
            result.append("<table style=\"width : 850\"><tr>");
            result.append("<td valign=\"top\" style=\"width : 560\"><b>" + paragraph2HTML(r.getHeaderData())+ "</b></td>");
            result.append("<td valign=\"top\" style=\"text-align : right\">" + paragraph2HTML(r.getImprint())+ "</td>");
            result.append("</tr><tr><td></td><td style=\"margin-bottom : 20; margin-top : 12; text-align : right\">"
                                                    + "Erstellt am " + r.convertDateToString(d) + "</td></tr></table>");

            Vector<Row> rows = r.getRows();
            result.append("<table style=\"width : 850\">");

            for ( Row row : rows ) {
                    result.append("<tr>");
                    for ( int k = 0; k < row.getNumColumns(); k++ ) {
                            result.append("<td valign=\"top\" style=\"text-align : center; margin-top : 5; margin-bottom : 5\">"
                                                    + row.getColumnAt(k)+ "</td>");
                    }
                    result.append("</tr>");
            }

            result.append("</table>");

            /*
             * Zum Schluß wird unser Arbeits-Buffer in einen String umgewandelt und der
             * reportText-Variable zugewiesen. Dadurch wird es möglich, anschließend
             * das Ergebnis mittels getReportText() auszulesen.
             */
            this.reportText = result.toString();

    }

    /**
     * Prozessieren des übergebenen Reports und Ablage im Zielformat. Ein Auslesen
     * des Ergebnisses kann später mittels <code>getReportText()</code> erfolgen.
     *
     * @param r der zu prozessierende Report
     */
    public void process(FlightmovementsOfSpecificPassengerReport r) {
            // Zunächst löschen wir das Ergebnis vorhergehender Prozessierungen.
            this.resetReportText();

            /*
             * In diesen Buffer schreiben wir während der Prozessierung sukzessive unsere
             * Ergebnisse.
             */
            StringBuffer result = new StringBuffer();

            /**
             * Erstellungsdatum zwischenspeichern
             */
            Date d = r.getDateOfReport();

            /*
             * Nun werden Schritt für Schritt die einzelnen Bestandteile des Reports
             * ausgelesen und in HTML-Form übersetzt.
             */
            result.append("<h2 style=\"color: blue\">" + r.getTitle() + "</h2>");
            result.append("<table style=\"width : 950\"><tr>");
            result.append("<td valign=\"top\" style=\"width : 560\"><b>" + paragraph2HTML(r.getHeaderData())+ "</b></td>");
            result.append("<td valign=\"top\" style=\"text-align : right\">" + paragraph2HTML(r.getImprint())+ "</td>");
            result.append("</tr><tr><td></td><td style=\"margin-bottom : 20; margin-top : 12; text-align : right\">"
                                                    + "Erstellt am " + r.convertDateToString(d) + "</td></tr></table>");

            Vector<Row> rows = r.getRows();
            result.append("<table style=\"width : 950\">");

            for ( Row row : rows ) {
                    result.append("<tr>");
                    for ( int k = 0; k < row.getNumColumns(); k++ ) {
                            result.append("<td valign=\"top\" style=\"text-align : center; margin-top : 5; margin-bottom : 5\">"
                                                    + row.getColumnAt(k)+ "</td>");
                    }
                    result.append("</tr>");
            }

            result.append("</table>");

            /*
             * Zum Schluß wird unser Arbeits-Buffer in einen String umgewandelt und der
             * reportText-Variable zugewiesen. Dadurch wird es möglich, anschließend
             * das Ergebnis mittels getReportText() auszulesen.
             */
            this.reportText = result.toString();
    }

    /**
     * Auslesen des Ergebnisses der zuletzt aufgerufenen Prozessierungsmethode.
     *
     * @return ein String im HTML-Format
     */
    public String getReportText() {
            return this.getHeader() + this.reportText + this.getTrailer();
    }
}